/**
 * harmony.UtilsBernardi.java
 * @author xavier.miorcec@elomobile.com
 * @6 avr. 2009
 * @ELO_dev_bernardi_200812
 */
package com.elomobile.harmony.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.log4j.Logger;

public class UtilsBernardi {

	private static final DateFormat dateFormatPlanning = new SimpleDateFormat("yyyyMMdd");
	private static final DateFormat dateFormatAffichagePDA = new SimpleDateFormat("dd/MM/yyyy");
	private static final DateFormat dateExportPDA = new SimpleDateFormat("yyyy-MM-dd");
	private static final DateFormat dateFormatFichier = new SimpleDateFormat("yyyyMMddHHmmssSSS");

	public static String formatterHeureToTransfertPda(String heure) {
		if (heure != null && heure.length() == 4) {
			return heure.substring(0, 2) + ":" + heure.substring(2, 4);
		} else {
			return "";
		}
	}

	/**
	 * Remplit les blanc du planning dans une date par un 0
	 * @param dateAFormater
	 * @return
	 */
	public static String formatterDatePDAD(String dateAFormater) {
		if (dateAFormater != null) {
			return dateAFormater.replaceAll(" ", "0");
		} else {
			return "";
		}
	}

	/**
	 * Formatage de la date au format affichage pda dd/MM/yyyy
	 * @param dateAFormater
	 * @return la dateFormater
	 */
	public static String formaterDateVoyage(String dateAFormater) {
		try {
			return dateFormatAffichagePDA.format(dateFormatPlanning.parse(dateAFormater));
		} catch (ParseException e) {
			return dateAFormater;
		}
	}

	/**
	 * Formatege de la date format ad-info vers la date d'export de l'interfaceElo
	 * @param date la date AD
	 * @return une date au format yyyy-MM-dd
	 */
	public static String formaterDateADINFOtoDateExport(String date) {
		try {
			return dateExportPDA.format(dateFormatPlanning.parse(date));
		} catch (ParseException e) {
			return "";
		}
	}

	/**
	 * R�cup�ration de la date et heure du jour pour les traitement Harmony
	 * Les envoies de missions sont envoy�e au jour le jour
	 * Tout bon de transport n'�tant pas � la date du jour ne sera pas envoy�.
	 * @return la date au format bidon AD-info (yyyymmdd00000) et de espaces � la place des 0 des mois et des jours.(2009 6 40000)
	 */
	public static String recupererDateHeureTraitementHarmony() {
		String maDate = dateFormatPlanning.format(new Date());
		String year = maDate.substring(0, 4);
		String mois = maDate.substring(4, 6).replaceAll("0", " ");
		String jour = maDate.substring(6, 8).replaceAll("0", " ");
		maDate = year + mois + jour + "0000";
		return maDate;
	}

	/**
	 * Supression du dernier caract�re s'il correspond au caract�re pass� en
	 * param�tre
	 * 
	 * @param pSString
	 *            la chaine que l'on souhaite trait�
	 * @param pSEnd
	 *            le caract�re fin qu'on souhaite supprimer
	 * @return un String dont le dernier caract�re a �t� supprimer
	 */
	public static String removeWhileIsLast(String pSString, String pSEnd) {
		String mSResult = pSString;
		while (true) {
			if (mSResult.endsWith(pSEnd)) {
				// �liminer le pattern suffix
				mSResult = mSResult.substring(0, mSResult.lastIndexOf(pSEnd));
			} else {
				break;
			}
		}
		return mSResult;
	}

	/** 
	 * Recupere la date Systeme au format "yyyyMMddHHmmss"
	 *	@return String yyyyMMddHHmmss
	 */
	public static String recupereDateHeureSystemeNomFichier() {
		return dateFormatFichier.format(new Date());
	}

	/**
	 * Renomme un fichier source en fichier destination
	 * @param nomSource
	 * @param nomDestination
	 * @return
	 */
	public static boolean renommeFichier(String nomSource, String nomDestination, Logger logger) {

		File source = new File(nomSource);
		File destination = new File(nomDestination);
		if (!destination.exists()) {
			// On essaye avec renameTo
			boolean result = source.renameTo(destination);
			if (!result) {
				// On essaye de copier
				result = true;
				result &= copier(source, destination, logger);
				result &= source.delete();
			}
			logger.debug("Renommage du fichier " + nomSource + " en " + nomDestination);
			return (result);
		} else {
			// Si le fichier destination existe, on annule ...
			return (false);
		}
	}

	/**
	 * Méthode de copie de fichier (parade au problème de copie en ascii d'un fichier log)
	 * @param source
	 * @param destination
	 * @param logger
	 * @return
	 */
	public static boolean copier(File source, File destination, Logger logger) {
		FileChannel in = null; // canal d'entrée
		FileChannel out = null; // canal de sortie

		try {
			// Init
			in = new FileInputStream(source.getAbsoluteFile()).getChannel();
			out = new FileOutputStream(destination.getAbsoluteFile()).getChannel();
			in.transferTo(0, in.size(), out);
		} catch (Exception e) {
			logger.error(e);
		} finally { // finalement on ferme

			try {
				in.close();
			} catch (IOException e) {
			}

			try {
				out.close();
			} catch (IOException e) {
			}

		}

		return true;
	}

	public static void main(String args[]) {
		System.out.println(removeWhileIsLast("BERNARDI, TEST, , ", ", "));
	}
}
